package org.banxico.ds.sisal.parser;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.banxico.ds.sisal.parser.entidades.CVE;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

/**
 * Clase que se encarga de realizar el parseo del flujo de entrada desde la URL proporcionada
 *
 * @author t41507
 * @version 04072014
 */
public class VulnerabilityParser implements java.io.Serializable {

    /**
     * Atributos de Serialización y Logger
     */
    private static final long serialVersionUID = -1L;
    private static final Logger LOG = Logger.getLogger(VulnerabilityParser.class.getName());
    /**
     * Atributos del Parser
     */
    private InputStream flujoEntrada;
    private SAXParserFactory saxParserFactory;
    private SAXParser saxParser;
    private VulnerabilityHandler manejador;
    private String filtro;
    
    /**
     * Método para obtener todas las  vulnerabilidades encontradas dentro del archivo de nvd
     *
     * @param is Flujo de entrada del archivo de nvd
     * @return
     */
    public List<CVE> getListCVE(InputStream is) {
        flujoEntrada = is;
        saxParserFactory = SAXParserFactory.newInstance();
        List<CVE> cveList = new ArrayList<CVE>();
        try {
            if (flujoEntrada.available() != 0) {
                saxParser = saxParserFactory.newSAXParser();
                manejador = new VulnerabilityHandler();
                Reader reader = new InputStreamReader(flujoEntrada, "UTF-8");
                InputSource isrc = new InputSource(reader);
                isrc.setEncoding("UTF-8");
                saxParser.parse(isrc, manejador);
                cveList = manejador.obtenerLista();
                return cveList;
            } else {
                LOG.log(Level.INFO, "Error al obtener el flujo de entrada. Saliendo del Parser.");
            }
        } catch (IOException e) {
            LOG.log(Level.INFO, "Ocurrio un error en el  flujo de entrada: {0}", e.getMessage());
        } catch (ParserConfigurationException ex) {
            LOG.log(Level.SEVERE, "Ocurrio un error en la configuraci\u00f3n del Parser: {0}", ex.getMessage());
        } catch (SAXException ex) {
            LOG.log(Level.SEVERE, "Ocurrio un error en la creaci\u00f3n del Parser: {0}", ex.getMessage());
        }
        return new ArrayList<CVE>();
    }

}